<?php

require_once 'application/libraries/PieChartLibrary.php';
require_once 'application/controllers/ReportesController.php';
require_once 'application/controllers/PacienteController.php';

if (!defined('BASEPATH'))
    exit('No direct script access allowed');

class AdminController extends CI_Controller {

    /**
     * Index Page for this controller.
     *
     * Maps to the following URL
     * 		http://example.com/index.php/welcome
     * 	- or -  
     * 		http://example.com/index.php/welcome/index
     * 	- or -
     * Since this controller is set as the default controller in 
     * config/routes.php, it's displayed at http://example.com/
     *
     * So any other public methods not prefixed with an underscore will
     * map to /index.php/welcome/<method_name>
     * @see http://codeigniter.com/user_guide/general/urls.html
     */
    public function index() {
        //$this->load->view('view_pacientes');
        $pacientes = new PacienteController();
                    $pacientes->index();
    }

    public function page($number) {
        if (!isset($number)) {
            echo "Seleccione una vista!";
        } else {
            switch ($number) {
                // Menu principal
                case 1:
                    //Pacientes
                    
                    break;
                case 2:
                    //Doctores
                    $this->load->model('DoctorModel');
                    $this->load->model('SpecialtyModel');
                    $data['doctors'] = $this->DoctorModel->getDoctors();
                    $data['specialties'] = $this->SpecialtyModel->getSpecialties();
                    $this->load->view('view_ver_doctores', $data);
                    break;
                case 3:
                    //Ver Detalle de Doctores
                    $dniDoctor = $this->input->get('id');
                    $this->load->model('DoctorModel');
                    $data['doctorInfo'] = $this->DoctorModel->getDoctorInfoById($dniDoctor);
                    
                    
                    
                    $this->load->view('view_ver_doctor_detalles', $data);
                    break;
                 case 4:
                    //Recepcionistas
                    $this->load->model('ReceptionistModel');
                    $data['receptionists'] = $this->ReceptionistModel->getReceptionists();
                    $this->load->view('view_ver_recepcionistas', $data);
                    break;
                case 5:
                    $reportes = new ReportesController();
                    $reportes->index();
                    //Reportes
                    /*
                    $this->load->model('SpecialtyModel');
                    $data['specialties'] = $this->SpecialtyModel->getSpecialties();
                    $pieController = new PieChartLibrary();
                    $cantidad = 4;
                    $piecesPro = array("Programada","Atendida","Anuladas", "Pendientes");
                    $piecesCant = array("10", "25", "42", "15");
                    $data['pScript'] = $pieController->loadPieChart($cantidad,$piecesPro, $piecesCant);
                    $data['cantidad'] = $cantidad;
                    
                    $this->load->view('view_ver_reportes', $data);
                     
                     */
                    
                    break;
                case 6:
                    //Información de las Especialidades
                    $this->getAllSpecialties();                    
                    break;   
                case 7:
                    //Información del Centro de Salud
                    $data = $this->getClinicInfo();
                    $data['message'] = null;
                    $this->showClinicInfo($data);
                    break;
            }
        }
    }

    public function agregar_paciente() {
        $this->load->view('template2');
    }
    
    //Métodos Doctor
    public function searchDoctor(){
        $names = ltrim(rtrim($this->input->post('names')));
        $lastName1 = ltrim(rtrim($this->input->post('lastName1')));
        $lastName2 = ltrim(rtrim($this->input->post('lastName2')));
        $cmp = ltrim(rtrim($this->input->post('cmp')));
        $specialty = $this->input->post('specialty');
        if($specialty == 0){
            $specialty = null;
        }
        $this->load->model('DoctorModel');
        $this->load->model('SpecialtyModel');
        if($names == null && $lastName1 == null && $lastName2 == null && $cmp == null && $specialty == null){
            $data['doctors'] = null;
        }else{
            $data['doctors'] = $this->DoctorModel->getDoctorInfo($names, $lastName1, $lastName2, $specialty, $cmp);
        }
        $data['specialties'] = $this->SpecialtyModel->getSpecialties();
        $this->load->view('view_ver_doctores', $data);
    }
    
    public function checkExist() {
        $this->load->library('form_validation');
        $this->form_validation->set_rules('dniSearch', 'DNI', 'required');
        $dni = $this->input->post('dniSearch');

        if ($this->form_validation->run() == FALSE) {
            echo 'noIngreso';
        }

        if ($this->input->post('dniSearch') != "") {
            if ($this->dniExist($dni)) {
                $this->load->model('DoctorModel');
                $searchData = $this->DoctorModel->getDoctorByDNI($dni);
                echo json_encode($searchData[0]);
                
            }else {
                echo 'noexiste';
            }
        }
    }

    public function dniExist($dni) {
        $query = $this->db->query("SELECT * FROM doctor WHERE ID_DOCTOR = '$dni' ");
        if (count($query->result()) == 0) {
            return FALSE;
        } else {
            return TRUE;
        }
    }

    public function registrarDoctor() {
        
        $dni = $this->input->post('dni');
        $nombres = $this->input->post('nombres');
        $apaterno = $this->input->post('apaterno');
        $amaterno = $this->input->post('amaterno');
        $telefono = $this->input->post('telefono');
        $celular = $this->input->post('celular');
        $correo = $this->input->post('correo');
        $cmp = $this->input->post('cmp');
                $fecha = $this->input->post('nacimiento');
        $nacimiento = date('Y-m-d', strtotime($fecha));        
        $especialidad = $this->input->post('especialidad');
        $direccion = $this->input->post('direccion');
        $genero = $this->input->post('genero');
        /*
                 
          echo 'dni: '.$dni."<br>";
          echo 'nombre: '.$nombres."<br>";
          echo 'paterno: '.$apaterno."<br>";
          echo 'amaterno: '.$amaterno."<br>";
          echo 'telefono: '.$telefono."<br>";
          echo 'celular: '.$celular."<br>";
          echo 'correo: '.$correo."<br>";
          echo 'cmp: '.$cmp."<br>";
          echo 'nacimiento: '.$nacimiento."<br>";
          echo 'direccion: '.$direccion."<br>";
          echo 'especialidad: '.$especialidad."<br>";
          echo 'genero: '.$genero."<br>";

          */
          
        $this->db->query("INSERT INTO persona VALUES
                 ('$dni','$nombres','$apaterno', '$amaterno','$genero', '$nacimiento' ,'$telefono', '$celular','$correo', '$direccion');");
        
        /*
        

        $this->db->query("INSERT INTO empleado VALUES('$dni',1,NULL);");

        $this->db->query("INSERT INTO doctor VALUES('$dni','$cmp', 'foto.png');");

        $this->db->query("INSERT INTO doctor_especialidad VALUES('$dni','$especialidad');");


        $this->db->query("INSERT INTO empleado_centro_salud VALUES('$dni',1,1);");

        
        redirect('AdminController');
        
         * 
         */
        
    }

    
    //Métodos Recepcionista
    public function searchReceptionist(){
        $names = ltrim(rtrim($this->input->post('names')));
        $lastName1 = ltrim(rtrim($this->input->post('lastName1')));
        $lastName2 = ltrim(rtrim($this->input->post('lastName2')));
        $this->load->model('ReceptionistModel');
        if($names == null && $lastName1 == null && $lastName2 == null){
            $data['receptionists'] = null;
        }else{
            $data['receptionists'] = $this->ReceptionistModel->getReceptionistInfo($names, $lastName1, $lastName2);
        }
        $this->load->view('view_ver_recepcionistas', $data);
    }
    
    //MÉTODOS ESPECIALIDADES  ---  INICIO
    //Función para buscar todas las especialidades del Centro de Salud
    public function getAllSpecialties(){
        //Se obtiene la información de todas las especialidades en el Centro de Salud
        $this->load->model('SpecialtyModel');
        $data['specialties'] = $this->SpecialtyModel->getSpecialties();
        
        //Se obtiene la información de todas las especialidades que no se encuentren en el Centro de Salud
        $data['specialtiesNotInClinic'] = $this->SpecialtyModel->getSpecialtiesNotInClinic();
        
        //Se carga la pantalla con todas las especialidades
        $this->load->view('view_specialties', $data);
    }
    
    //Función para buscar todas las especialidades del Centro de Salud según parámetros
    public function searchSpecialties(){
        //Parámetros de búsqueda
        $name = ltrim(rtrim($this->input->post('name')));
        
        //Se obtiene la información de las especialidades en base a la búsqueda
        $this->load->model('SpecialtyModel');
        if($name == null){
            //En caso de campo vacio, se cargan nuevamente todas las especialides
            $this->getAllSpecialties();
        }else{
            //En caso de campos con valores, se carga la información relacionada con la búsqueda
            $data['specialties'] = $this->SpecialtyModel->getSpecialtyInfoByName($name);
            
            //Se obtiene la información de todas las especialidades que no se encuentren en el Centro de Salud
            $data['specialtiesNotInClinic'] = $this->SpecialtyModel->getSpecialtiesNotInClinic();
        
            //Se carga la pantalla con las especilidades encontradas
            $this->load->view('view_specialties', $data);
        }   
    }
    
    //Función para agregar una nueva especialidad al Centro de Salud
    public function addSpecialty(){
        //Obtener datos para el nuevo registro
        $specialtyId = $this->input->post('specialtyId');
        $specialtyTime = $this->input->post('specialtyTime');
        $specialtyAditional = $this->input->post('specialtyAditional');
        $data = array( 'ID_ESPECIALIDAD' => $specialtyId,
            'ID_CENTRO_SALUD' => CENTRO_SALUD,
            'minutos_cita' =>  $specialtyTime,
            'adicionales_dia' => $specialtyAditional,
            'activo' => 1);
        
        //Se lleva a cabo el registro de la nueva especialidad
        $this->load->model('SpecialtyModel');
        $this->SpecialtyModel->addSpecialty($data);
        
        //Se carga nuevamente la pantalla con las especialidades
        redirect(base_url()."AdminController/page/6");
    }
    
    //Función para obtener la información de la especialidad a editar
    public function getSpecialtyInfo(){
        //Datos a consultar
        $specialtyId = $this->input->post('specialty_id');
        
        //Se obtiene la información de la especialidad en el Centro de Salud
        $this->load->model('SpecialtyModel');
        $data['specialty'] = $this->SpecialtyModel->getSpecialtyInfoById($specialtyId);
        
        //Se carga el modal con la información de la especialidad
        $this->load->view('edit_specialty', $data);
    }
    
    //Función para actualizar la información de la especialidad seleccionada
    public function updateSpecialtyInfo(){
        //Obtener datos para la actualización
        $specialtyId = $this->input->post('specialtyId');
        $specialtyTime = $this->input->post('specialtyTime');
        $specialtyAditional = $this->input->post('specialtyAditional');
        $data = array( 'minutos_cita' =>  $specialtyTime,
            'adicionales_dia' => $specialtyAditional);
        
        //Se lleva a cabo la actualizacón
        $this->load->model('SpecialtyModel');
        $this->SpecialtyModel->updateSpecialtyInfo($data, $specialtyId);
        
        //Se carga nuevamente la pantalla con las especialidades
        redirect(base_url()."AdminController/page/6");
    }
    
    //Función para obtener la pantalla de confirmación de eliminación
    public function showSpecialtyDeleteConf(){
        //Datos a consultar
        $specialtyId = $this->input->post('specialty_id');
        
        //Se obtiene la información de la especialidad en el Centro de Salud
        $this->load->model('SpecialtyModel');
        $data['specialty'] = $this->SpecialtyModel->getSpecialtyInfoById($specialtyId);
        
        //Se carga el modal con la pantalla de confirmación de la eliminación
        $this->load->view('delete_specialty', $data);
    }
    
    //Función para alimnar (desactivar) la información de la especialidad seleccionada
    public function deactivateSpecialty(){
        //Obtener datos para la desactivación
        $specialtyId = $this->input->post('specialtyId');
        
        //Se lleva a cabo la desactivación de la especialidad
        $this->load->model('SpecialtyModel');
        $this->SpecialtyModel->deactivateSpecialty($specialtyId);
        
        //Se carga nuevamente la pantalla con las especialidades
        redirect(base_url()."AdminController/page/6");
    }
    
    //Función para obtener la pantalla de confirmación de la reactivación
    public function showSpecialtyActivConf(){
        //Datos a consultar
        $specialtyId = $this->input->post('specialty_id');
        
        //Se obtiene la información de la especialidad en el Centro de Salud
        $this->load->model('SpecialtyModel');
        $data['specialty'] = $this->SpecialtyModel->getSpecialtyInfoById($specialtyId);
        
        //Se carga el modal con la pantalla de confirmación de la reactivación
        $this->load->view('activate_specialty', $data);
    }
    
    //Función para activar nuevamente la información de la especialidad seleccionada
    public function activateSpecialty(){
        //Obtener datos para la desactivación
        $specialtyId = $this->input->post('specialtyId');
        
        //Se lleva a cabo la desactivación de la especialidad
        $this->load->model('SpecialtyModel');
        $this->SpecialtyModel->activateSpecialty($specialtyId);
        
        //Se carga nuevamente la pantalla con las especialidades
        redirect(base_url()."AdminController/page/6");
    }
    //MÉTODOS ESPECIALIDADES  ---  FIN
    
    
    //MÉTODOS CENTRO DE SALUD  ---  INICIO
    //Función para buscar la información del Centro de Salud
    public function getClinicInfo(){
    //Se obtiene la información del Centro de Salud
        $this->load->model('ClinicModel');
        $data['clinic'] = $this->ClinicModel->getClinicInfo();
        
        //Obtener el horario de inicio y fin de la atención en formato de texto
        $startTimeStr = $data['clinic']['hora_inicio_atencion'];
        $endTimeStr = $data['clinic']['hora_fin_atencion'];
        
        //Variables para el llenado de los ComboBox
        $startTime = explode(':', $startTimeStr);
        $data['startTimeCombo'] = $startTime[0];
        $endTime = explode(':', $endTimeStr);
        $data['endTimeCombo'] = $endTime[0];
        
        //Convertir las horas al formato "Time"
        $data['clinic']['hora_inicio_atencion'] = date("h:i a", mktime($startTime[0], $startTime[1], $startTime[2]));
        $data['clinic']['hora_fin_atencion'] = date("h:i a", mktime($endTime[0], $endTime[1], $endTime[2]));
        
        //Se envía la información obtenida
        return $data;        
    }
    
    //Función para mostrar la información del Centro de Salud
    public function showClinicInfo($data){
        //Se carga la pantalla con la información del Centro de Salud
        $this->load->view('view_parameters', $data);
    }
    
    public function updateParameters(){
        //Obtener datos para la actualización
        $startTimeCombo = $this->input->post('startTime');
        $endTimeCombo = $this->input->post('endTime');
        $maxTimeReserv = $this->input->post('maxTimeReserv');
        $minTimeReserv = $this->input->post('minTimeReserv');
        $maxTimeCancel = $this->input->post('maxTimeCancel');
        
        //Evitar que se pueda acceder a la actualización de los parámetros mediante la URL
        if($startTimeCombo == null || $endTimeCombo == null || $maxTimeReserv == null || 
                $minTimeReserv == null || $maxTimeCancel == null){
            redirect(base_url()."AdminController/page/7");
        }
        
        //Asignar los datos para la actualizaión
        $data = array( 'dias_max_reserva' =>  $maxTimeReserv,
            'dias_min_reserva' =>  $minTimeReserv,
            'dias_max_cancelacion' => $maxTimeCancel);
        
        //Mensaje de error
        $mensaje = '';

        //Convertir los datos seleccionados al formato "Time"
        $startTime = date("H:i:s", mktime($startTimeCombo, 0, 0));
        $endTime= date("H:i:s", mktime($endTimeCombo, 0, 0));
        
        //Bloques de trabajo afectados
        $affectedWBsStartTime = array();
        $affectedWBsEndTime = array();
        
        //Se carga la información de las tablas que se necesiatrán
        $this->load->model('ClinicModel');
        $this->load->model('ScheduleModel');
        $this->load->model('WorkBlockModel');
        
        //HORARIOS QUE TERMINAN EN MENOS DE 7 DÍAS
        //Obtener la información de los horarios que terminarán en menos de 7 días       
        $schedulesLess7 = $this->ScheduleModel->getUnfinishedSchedulesLess7Days();
        
        if($schedulesLess7 != null){
            //Verificar la información para cada horario
            foreach ($schedulesLess7 as $sch){
                //Fecha final del horario
                $endDate = date("Y-m-d", strtotime($sch->fecha_fin));
                //Fecha actual
                $today = TODAY;

                //Arreglo para almacenar los días restantes del horario (Menos de 7 días)
                $dayNumbers = array();
                
                //Guardar los días restantes entre el día actual y la fecha final del horario
                while($today <= $endDate){
                    //Se guardan los días que podrían ser afectados por el cambio (valores del 1 al 7)
                    $dayNumbers[] = date("N", strtotime($today)); 
                    $today = date("Y-m-d", strtotime("+1 day",strtotime($today)));   
                }

                //Agregar los bloques de trabajo que se ven afectados por la "hora inicial"
                $workblocksLess7StartTime = $this->WorkBlockModel->getWBAffectedByStartTimeLess7($startTime, $sch->ID_HORARIO, $dayNumbers);
                if($workblocksLess7StartTime != null){
                    foreach($workblocksLess7StartTime as $wbst){
                        $affectedWBsStartTime[] = $wbst;
                    }
                }

                //Agregar los bloques de trabajo que se ven afectados por la "hora final"
                $workblocksLess7Endtime = $this->WorkBlockModel->getWBAffectedByEndTimeLess7($endTime, $sch->ID_HORARIO, $dayNumbers);
                if($workblocksLess7Endtime != null){
                    foreach($workblocksLess7Endtime as $wbet){
                        $affectedWBsEndTime[] = $wbet;
                    }
                }
             }
        }
        
        //HORARIOS QUE TERMINAN EN MÁS DE 7 DÍAS
        //Agregar los bloques de trabajo que se ven afectados por la "hora inicial"
        $workblocksMore7StartTime = $this->WorkBlockModel->getWBAffectedByStartTime($startTime);
        if($workblocksMore7StartTime != null){
            foreach($workblocksMore7StartTime as $wbst){
                $affectedWBsStartTime[] = $wbst;
            }
        }
        //Agregar los bloques de trabajo que se ven afectados por la "hora inicial"
        $workblocksMore7EndTime = $this->WorkBlockModel->getWBAffectedByEndTime($endTime);
        if($workblocksMore7EndTime != null){
            foreach($workblocksMore7EndTime as $wbet){
                $affectedWBsEndTime[] = $wbet;
            }
        }
        
        //Se verifica si es posible cambiar la "hora inicial"
        if($affectedWBsStartTime == null){
            //Se agregar el valor a actualizar de "hora inicial"
            $data['hora_inicio_atencion'] = $startTime;
        }else{
            $mensaje.='No se puede cambiar la hora de inicio de atenci&oacute;n debido a conflictos con horarios existentes. <br/>';
        }
        
        //Se verifica si es posible cambiar la "hora final"
        if($affectedWBsEndTime == null){
            //Se agregar el valor a actualizar de "hora final"
            $data['hora_fin_atencion'] = $endTime;
        }else{
            $mensaje.='No se puede cambiar la hora de fin de atenci&oacute;n debido a conflictos con horarios existentes. <br/>';
        }
        
        //Se lleva a cabo la actualizacón
        $this->ClinicModel->updateClinicInfo($data);
        
        //Se obtiene la información actualizada del Centro de Salud
        $clinicInfo = $this->getClinicInfo();
        
        //Se agregar el mensaje de error en caso de haberse generado uno
        $clinicInfo['message'] = $mensaje;
        
        //Se carga nuevamente la pantalla con los datos del Centro de Salud
        $this->showClinicInfo($clinicInfo);
    }
    //MÉTODOS CENTRO DE SALUD  ---  FIN
    
    
    
    
    
    
    
    
    public function ver_recepcionistas() {
        $this->load->view('view_ver_recepcionistas');
    }

    public function ver_doctor_detalle() {
        $this->load->view('view_ver_doctor_detalles');
    }

    public function ver_reportes() {
        $this->load->view('view_ver_reportes');
    }
}

/* End of file welcome.php */
/* Location: ./application/controllers/welcome.php */